iT邦幫忙

2025 iThome 鐵人賽

DAY 3
0
Software Development

用作業系統讀懂另一半的OS系列 第 3

【2025鐵人賽】用作業系統讀懂另一半的OS:Overview 02

  • 分享至 

  • xImage
  •  

今天台南淹大水,不知道台南的朋朋們是否還過得安好
https://ithelp.ithome.com.tw/upload/images/20250803/20177764bi9t4bNmfq.jpg

核心(kernel)

核心(Kernel)是作業系統中最重要、永遠在運作的核心程式,就像是作業系統的大腦,負責管理整台電腦的資源和行程。具體來說,Kernel 要負責:

  • 管理Memory
  • 分配 CPU 資源(這部分,之後就會談到CPU scheduling)
  • 控制檔案系統與資料存取
  • 控制I/O裝置的協調(像鍵盤、滑鼠、印表機)
  • 負責多個程式同時執行的管理(這部分,之後就會談到 Multi programing)

Kernel就像是默默在為感情付出的那個人。
大家也要記得,去感謝那位默默無悔放出的那個人歐

雖然 Kernel 得運作是隱藏在幕後,但它與兩種常見的程式類型有密切關係:
第一個是系統程式(System Programs):幫助使用者與作業系統互動,通常提供工具與介面,但不一定屬於核心的一部分。
第二個是應用程式(Application Programs):是使用者執行的程式,與作業系統無直接關係,但需要經過核心協助才能使用電腦資源。

Polling(輪詢)

當電腦與外部裝置(像印表機、硬碟)進行資料交換時,Polling(輪詢)是一種最基本的方式。CPU 主動、不斷地詢問裝置是否準備好傳送或接收資料的一種通訊方法。就像是一位心心念念的媽媽,不斷不斷敲門詢問「吃飯沒?」「生活還好嗎?」「有沒有好好過生活?」。雖然Polling簡單易實作,但也一位他要不斷訓問,因此浪費大量 CPU 資源,導致其他工作延遲。

我們看看詳細步驟:

  1. CPU會不斷polling busy bit(狀態暫存器),直到裝置準備好
  2. I/O的部分,就會開始寫入資料,直到資料寫入完畢(Data-out)
  3. I/O設定command-ready,告知我輸入完了
  4. CPU接收命令→ 執行 → 清除 busy狀態

中斷(Interrupts)

了解完Polling後,就可以來看看中斷(Interrupt)。Interrupt是CPU與外部裝置之間通訊的重要機制,可讓系統即時回應硬體事件,而非不斷polling浪費效能。Interrupts的流程大致如下:

  1. CPU 執行使用者程式
  2. IO裝置完成任務後發出中斷訊號(interrupt signal)
  3. CPU 接收到中斷後,暫停目前執行的程式,並根據中斷向量表(Interrupt Vector Table)跳到對應的中斷服務程式(ISR)
  4. ISR(Interrupt Service Routine) 處理完事件後,還原先前 CPU 狀態,繼續執行原本的程式

主要的重點就是,CPU與裝置之間引入了「訊號」的機制,讓CPU不用一直詢問浪費資源。

那如果以I/O system的角度來看Interrupts,大致如下:(這邊是恐龍書Chapter 12)

  1. CPU 啟動 I/O
  2. 裝置完成後產生中斷信號(interrupt request)
  3. CPU 儲存狀態 → 跳轉至中斷處理程序(ISR)
  4. 處理完後返回原本任務

https://ithelp.ithome.com.tw/upload/images/20250723/201777641ZErnXCaBu.png

中斷向量表(Interrupt Vector Table)

上述在提中斷(Interrupts)的過程中,當裝置發生中段信號,CPU便會儲存當前狀態,進而去處理中斷處理程序(ISR)。而存放中斷處理程序(ISR)得地方就是中斷向量表(Interrupt Vector Table)。

Interrupt Vector Table是一個指標陣列(反正就是一個空間~),紀錄著【訊號:要做什麼動作】,,能讓CPU能根據ISR快速跳轉處理。此外,中斷類型可以近一步細分為:

  • Non-maskable:不可屏蔽中斷,無法被忽略,例如硬體錯誤
  • Maskable:可屏蔽中斷,可由軟體設定是否暫時忽略

而當多個裝置同時共用一條中斷線時,便是所謂的中斷連鎖機制(Interrupt Chaining)。也就是說,一個ISR 執行後,便可以同時主動查詢其他可能發出中斷的裝置,依序處理。下面這張就是Interrupt的基本流程圖(Interrupt Handling Flow):

https://ithelp.ithome.com.tw/upload/images/20250723/20177764RnFS0oR5Fe.png

系統呼叫(System Calls)

當我們在寫read()、write()、open()這些操作周邊I/O的指令時,對於我們使用者來說,並不是直接操作硬體,而是透過一種途徑「請OS幫忙操作」,這個途徑就叫System Call。

可以理解為,用程式拿起電話打給作業系統的核心(Kernel)。跟他說「嘿~幫我把檔案存起來」、「幫我跟硬碟要資料」…

在OS中,幾乎所有重要事件都是透過Interrupt去做到OS與周邊I/O的交互。Interrupt有三種常見來源:

  1. 硬體中斷 (Hardware Interrupt):像是磁碟寫入、滑鼠移動這一類,由I/O主動通知 CPU
  2. 陷阱/例外 (Trap / Exception):就是程式發生錯誤時的系統介入。例如除以零、非法存取記憶體。
  3. 軟體中斷 (Software Interrupt):也就是這邊要說的System Call,程式主動請求系統幫忙做特權操作

對於使用者來說,我們都常在操作的都是API(Application Programming Interface),也就是OS已經提供好的函式庫(如 Linux 的 libc)實作。優點是跨平台、簡單好寫,不用煩惱細節。下圖是呼叫read時的System Calls邏輯:

https://ithelp.ithome.com.tw/upload/images/20250723/20177764IFotAHfZaG.png

那當我們在使用API做System Call時,API的參數是如何傳遞的呢?
如果傳遞的數量比較少,就會直接使用佔存器:如果參數較多,就使用stack(推入資料)或記憶體區塊(把所有參數放進記憶體,然後只傳這個位置)。以Linux舉例,Linux結合以上兩種:少的用暫存器,多的就用 block。

那這邊在整理下系統呼叫(System Call)跟中斷(Interrupt):

https://ithelp.ithome.com.tw/upload/images/20250723/20177764jREnre335m.png

Direct Memory Access(DMA)

在電腦中,資料在裝置與記憶體之間,就是「需要 → 搬過去記憶體 → 用完 → 搬回裝置」。但這一段「搬資料的工作」如果全都要經過 CPU,會發生什麼事呢?
在傳統的 I/O 模型中,資料傳輸是由 CPU 控制的:

  1. CPU 從裝置讀取一筆資料
  2. 再將資料寫入主記憶體
  3. 每筆資料都要經過 CPU 操作(造成 overhead)(每一筆資料都要經過 CPU 手動「搬來搬去」)

這樣這種方式在處理大量資料(如硬碟檔案、音訊串流)時效率低落。CPU 資源被浪費在搬運資料上,而無法專注處理其他運算任務。而Direct Memory Access(DMA) 是一種由硬體控制器(稱為 DMA 控制器)所主導的資料傳輸機制。DMA允許 I/O 裝置(如硬碟、音效卡、網卡)直接與主記憶體(RAM)進行資料傳輸,跳過CPU介入,以節省 CPU 資源並提高效能。主機只需要事先提供這三個資訊,就可以叫:DMA控制器幫忙搬資料摟~

  • 來源/目的的記憶體位址
  • 資料長度(要傳多少)
  • 指令區塊(Command Block):用來描述任務的控制結構

DMA 的工作邏輯是這樣大致如下:

  1. CPU 下命令:告訴「裝置驅動程式」(device driver),想把資料搬到記憶體某個位置
  2. 驅動程式轉達詳細任務:轉給控制器(例如磁碟控制器),說:「請把 c bytes 的資料搬到記憶體 x」
  3. DMA 控制器接手
    1. 一筆一筆將資料搬到記憶體 x
    2. 每搬完一筆就更新位置(x++)
    3. 同時遞減剩下的資料量(c--)
  4. 搬完後,通知 CPU(透過中斷):「老闆,我搬好了,來驗收吧!」

呼~打了好多,接下來就明天再說吧XD


上一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Overview 01
下一篇
【2025鐵人賽】用作業系統讀懂另一半的OS:Overview 03
系列文
用作業系統讀懂另一半的OS30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言